package org.ciallo.simplemusicplayer.adapter;

import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.color.MaterialColors;
import org.ciallo.simplemusicplayer.R;
import org.ciallo.simplemusicplayer.data.model.Song;
import org.ciallo.simplemusicplayer.util.Constants;
import timber.log.Timber;

import java.util.List;

/**
 * @author Jukomu
 * @Description: 播放队列 RecyclerView 的适配器。
 * 用于显示当前播放队列中的歌曲，并处理点击播放和移除操作
 * @Package: org.ciallo.simplemusicplayer.adapter
 * @Project: SimpleMusicPlayer
 * @name: PlayQueueAdapter
 * @Date: 2025/5/29-00:23
 * @Filename: PlayQueueAdapter
 */
public class PlayQueueAdapter extends ListAdapter<Song, PlayQueueAdapter.QueueItemViewHolder> {

    private long currentPlayingSongId; // 用于高亮当前播放的歌曲
    private final OnQueueItemClickListener itemClickListener;
    private final OnQueueRemoveClickListener removeClickListener;

    /**
     * 列表项点击监听器接口。
     */
    public interface OnQueueItemClickListener {
        /**
         * 当队列中的歌曲项被点击时调用。
         *
         * @param song     被点击的歌曲对象。
         * @param position 被点击的歌曲在当前显示列表中的位置 (相对于此Adapter的列表)。
         */
        void onQueueItemClick(Song song, int position);
    }

    /**
     * 移除按钮点击监听器接口。
     */
    public interface OnQueueRemoveClickListener {
        /**
         * 当歌曲项的移除按钮被点击时调用。
         *
         * @param song     要移除的歌曲对象。
         * @param position 要移除的歌曲在当前显示列表中的位置 (相对于此Adapter的列表)。
         */
        void onQueueRemoveClick(Song song, int position);
    }

    /**
     * PlayQueueAdapter 的构造函数。
     *
     * @param itemClickListener   列表项点击事件的监听器。
     * @param removeClickListener 移除按钮点击事件的监听器。
     */
    public PlayQueueAdapter(OnQueueItemClickListener itemClickListener,
                            OnQueueRemoveClickListener removeClickListener) {
        super(DIFF_CALLBACK);
        this.currentPlayingSongId = Constants.INVALID_INDEX; // 初始没有播放的歌曲
        this.itemClickListener = itemClickListener;
        this.removeClickListener = removeClickListener;
    }

    /**
     * DiffUtil.ItemCallback 用于高效更新列表。
     */
    private static final DiffUtil.ItemCallback<Song> DIFF_CALLBACK = new DiffUtil.ItemCallback<Song>() {
        @Override
        public boolean areItemsTheSame(@NonNull Song oldItem, @NonNull Song newItem) {
            return oldItem.getId() == newItem.getId();
        }

        @Override
        public boolean areContentsTheSame(@NonNull Song oldItem, @NonNull Song newItem) {
            return oldItem.equals(newItem);
        }
    };

    @NonNull
    @Override
    public QueueItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_song_in_queue, parent, false);
        return new QueueItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull QueueItemViewHolder holder, int position) {
        Song song = getItem(position);
        if (song != null) {
            holder.bind(song, song.getId() == currentPlayingSongId, itemClickListener, removeClickListener);
        }
    }

    /**
     * 更新播放队列数据和当前播放的歌曲ID。
     *
     * @param newQueue                新的歌曲队列。
     * @param newCurrentPlayingSongId 新的当前播放歌曲ID。
     */
    public void updateQueueAndCurrentSong(@Nullable List<Song> newQueue, long newCurrentPlayingSongId) {
        int oldSize = getItemCount();
        int newSize = (newQueue != null) ? newQueue.size() : 0;
        Timber.d("PlayQueueAdapter_Update: currentPlayingId=%d, oldListSize=%d, newListSize=%d", newCurrentPlayingSongId, oldSize, newSize);
        if (newQueue != null && !newQueue.isEmpty()) {
            Timber.d("PlayQueueAdapter_Update: First song in newQueue: %s", newQueue.get(0).getTitle());
        }
        this.currentPlayingSongId = newCurrentPlayingSongId;
        submitList(newQueue);
    }


    /**
     * ViewHolder 类，用于缓存列表项的视图引用。
     */
    static class QueueItemViewHolder extends RecyclerView.ViewHolder {
        ImageView ivPlayingIndicator;
        TextView tvTitle;
        TextView tvArtist;
        ImageButton btnRemove;

        /**
         * ViewHolder 构造函数。
         *
         * @param itemView 列表项的根视图。
         */
        QueueItemViewHolder(View itemView) {
            super(itemView);
            ivPlayingIndicator = itemView.findViewById(R.id.imageView_item_queue_playing_indicator);
            tvTitle = itemView.findViewById(R.id.textView_item_queue_song_title);
            tvArtist = itemView.findViewById(R.id.textView_item_queue_song_artist);
            btnRemove = itemView.findViewById(R.id.imageButton_item_queue_remove);
        }

        /**
         * 将歌曲数据绑定到视图控件，并设置监听器。
         *
         * @param song                要绑定的歌曲对象。
         * @param isCurrentlyPlaying  此歌曲是否为当前正在播放的歌曲。
         * @param itemClickListener   列表项点击监听器。
         * @param removeClickListener 移除按钮点击监听器。
         */
        void bind(final Song song, boolean isCurrentlyPlaying,
                  final OnQueueItemClickListener itemClickListener,
                  final OnQueueRemoveClickListener removeClickListener) {

            tvTitle.setText(song.getTitle());
            tvArtist.setText(song.getArtistName());

            Context context = itemView.getContext();

            // 使用 MaterialColors 从主题属性获取颜色，提供默认颜色以防万一
            int colorPrimary = MaterialColors.getColor(context, com.google.android.material.R.attr.colorPrimary, Color.DKGRAY);
            int colorOnSurface = MaterialColors.getColor(context, com.google.android.material.R.attr.colorOnSurface, Color.BLACK);
            int colorOnSurfaceVariant = MaterialColors.getColor(context, com.google.android.material.R.attr.colorOnSurfaceVariant, Color.GRAY);

            if (isCurrentlyPlaying) {
                ivPlayingIndicator.setVisibility(View.VISIBLE);
                tvTitle.setTextColor(colorPrimary);
                tvTitle.setTypeface(null, Typeface.BOLD);
                tvArtist.setTextColor(colorPrimary);
            } else {
                ivPlayingIndicator.setVisibility(View.GONE);
                tvTitle.setTextColor(colorOnSurface);
                tvTitle.setTypeface(null, Typeface.NORMAL);
                tvArtist.setTextColor(colorOnSurfaceVariant);
            }

            itemView.setOnClickListener(v -> {
                if (itemClickListener != null) {
                    itemClickListener.onQueueItemClick(song, getAdapterPosition());
                }
            });

            btnRemove.setOnClickListener(v -> {
                if (removeClickListener != null) {
                    removeClickListener.onQueueRemoveClick(song, getAdapterPosition());
                }
            });
        }
    }
}
